import datetime
import os
import time

import pymysql.cursors

# 连接数据库
connect = pymysql.Connect(
    host='172.27.1.126',
    port=3306,
    user='root',
    passwd='root',
    db='test',
    charset='utf8'
)
# 要生成的表
tables = ['dwd_data_analysis_course_study_fact']

# 生成文件的路径
file_path = r'C:\Users\zhangqiang\Desktop\datax\mysql2hive\\'


# 创建文件
# file_path：文件路径
# msg：即要写入的内容
def create__file(file_path, msg):
    f = open(file_path, "a")
    f.write(msg)
    f.close


def mkdir(path):
    # 去除首位空格
    path = path.strip()
    # 去除尾部 \ 符号
    path = path.rstrip("\\")

    # 判断路径是否存在
    # 存在     True
    # 不存在   False
    isExists = os.path.exists(path)

    # 判断结果
    if not isExists:
        # 如果不存在则创建目录
        # 创建目录操作函数
        os.makedirs(path)

        print(path + ' 创建成功')
        return True
    else:
        # 如果目录存在则不创建，并提示目录已存在
        print(path + ' 目录已存在')
        return False


def data_type(type):
    dType = {'bigint': 'BIGINT',
             'integer': 'BIGINT',
             'int': 'BIGINT',
             'tinyint': 'BIGINT',
             'smallint': 'BIGINT',
             'float': 'DOUBLE',
             'double': 'DOUBLE',
             'decimal': 'DOUBLE',
             'binary': 'BINARY',
             'varbinary': 'BINARY',
             'char': 'STRING',
             'varchar': 'STRING',
             'mediumtext': 'STRING',
             'text': 'STRING',
             'datetime': 'STRING',
             'time': 'STRING',
             'timestamp': 'STRING',
             'bit': 'BOOLEAN',
             'date': 'date',
             'json': 'MAP<STRING,STRING>'}
    dicStr = [dType[i] for i in [type]]
    return dicStr[0]


# 获取游标
cursor = connect.cursor()

# 格式化时间作为生成目录
dt = datetime.datetime.now().strftime('%Y%m%d%H%M%S')

for i in tables:
    # sql_str定义
    sql_h1 = 'CREATE EXTERNAL TABLE data_analysis.' + i + '('
    sql_h2 = '\n)\n ROW FORMAT DELIMITED FIELDS TERMINATED BY \'\\t\' \n STORED AS TEXTFILE \nLOCATION ' \
             '\'/user/hive/warehouse/data_analysis.db/' + i + '\'; '

    # 查询数据
    sql = "show full columns from %s;" % i
    cursor.execute(sql)
    columns = cursor.fetchall()

    # 获取mysql_table字段和类型
    data = [
        {
            'name': i[0],
            'type': i[1]
        } for i in columns
    ]

    # sql_str组装
    for j in data:
        tc = '\n\t\t\t\t\t\t\t{'
        list1 = [j[k] for k in ['name', 'type']]
        column = list1[0]
        type = data_type(list1[1].split('(')[0])

        # hive表创建语句
        sql_h1 += '\n' + column + ' ' + type + ','

    sql_h1 = sql_h1[:-1] + sql_h2;

    # 调用函数
    if mkdir(file_path+dt):
        create__file(file_path+dt+'\\' + i + '2hive.sql', sql_h1)
        print('success')
        time.sleep(1)
    else:
        print('exists')
    print('共查找出', cursor.rowcount, '条数据')
# 关闭连接
cursor.close()
connect.close()
